<?php
class cpBase
{
	static public $module;//模块名称
	static public $action;//操作名称
	static public $config=array();//配置信息

	function __construct()
	{
		//应用常量
		define ( 'GPHP_VERSION', '1.0.2012.0101' );	//框架版本定义，2011.0312表示发布日期
		define ( 'GPHP_PATH', dirname(__FILE__) );	//当前文件所在的目录
		
		//应用配置
		self::$config = is_array($config) ? array_merge(cpConfig::get('APP'), $config) : cpConfig::get('APP');//读取应用配置
		cpConfig::set('APP', self::$config);//重置应用配置
		define ( 'GPHP_LOADED', TRUE );//已经加载了默认配置文件
		
		//错误提示
		if(self::$config['DEBUG']){
			error_reporting(E_ALL ^ E_NOTICE);
		}else{
			error_reporting(0);
		}
		
		//注册类的自动加载
		if(function_exists('spl_autoload_register')){
			spl_autoload_register('self::autoload');
		}

		//默认文件包含
		$this->_include();

		//系统常量定义
		$this->_define();
		
		//网址解析
		if(function_exists('url_parse_ext'))
		{
			url_parse_ext();//自定义网址解析
		}
		else if (self::$config['APP']["URL_MODE"]==2)
		{
			$this->_module();//原生URL模式,获取模块
			$this->_action();//原生URL模式,获取动作
		}
		else
		{
			$this->_parseUrl();//PATHINFO模式
		}

		//在其他页面通过$_GET['_module']和$_GET['_action']获取得到当前的模块和操作名
		self::$module=empty(self::$module)?self::$config['MODULE_DEFAULT']:self::$module;
		self::$action=empty(self::$action)?self::$config['ACTION_DEFAULT']:self::$action;
		self::$module=str_replace(array('\\','/'),'',self::$module);//过滤一下模块名
		self::$action=str_replace(array('\\','/'),'',self::$action);//过滤一下操作名
		
		//
		$_GET['_module']=self::$module;
		$_GET['_action']=self::$action;
		
		//
		define ("G_MODULE", self::$module);
		define ("G_ACTION", self::$action);
	}

	//实现类的自动加载
	static public function autoload($classname)
	{
		$class_array=array();
		$base_path=GPHP_PATH;
		$class_array[]=self::$config['MODULE_PATH'].$classname.'.class.php';//加载模块文件
		$class_array[]=$base_path.'/'.$classname.'.class.php';//核心文件
		$class_array[]=$base_path.'/../lib/'.$classname.'.class.php';//官方扩展库
		$class_array[]=$base_path.'/../ext/'.$classname.'.class.php';//第三方扩展库
		$class_array[]=self::$config['MODEL_PATH'].$classname.'.class.php';//加载模型文件
		foreach($class_array as $file)
		{
			if(is_file($file)){
			    require_once($file);
				return TRUE;
			}
		}
		return FALSE;
	}

	//输出错误信息
	public function error($str)
	{
		require_once(GPHP_PATH.'/cpError.class.php');
		cpError::show($str);//输出错误信息
	}

	/**
	 * 解析网址
	 */
    private function _parseUrl()
	{
		$script_name=$_SERVER["SCRIPT_NAME"];//获取当前文件的路径
		$url= $_SERVER["REQUEST_URI"];//获取完整的路径，包含"?"之后的字符串

		//去除url包含的当前文件的路径信息
		if($url&&@strpos($url,$script_name,0)!==false)
		{
			 $url=substr($url,strlen($script_name));
		}
		else
		{
			$script_name=str_replace(basename($_SERVER["SCRIPT_NAME"]),'',$_SERVER["SCRIPT_NAME"]);
			if($url&&@strpos($url,$script_name,0)!==false)
			{
			 $url=substr($url,strlen($script_name));
			}
		}
		//第一个字符是'/'，则去掉
		if($url[0]=='/')
		{
			$url=substr($url, 1);
		}
		//去除问号后面的查询字符串
		if($url&&false!==($pos=@strrpos($url,'?')))
		{
			$url=substr($url,0,$pos);
		}
		//去除后缀
		if($url&&($pos=strrpos($url,self::$config['URL_HTML_SUFFIX']))>0)
		{
			$url=substr($url,0,$pos);
		}
		$flag=0;
		//获取模块名称
		if($url&&($pos=@strpos($url,self::$config['URL_MODULE_DEPR'],1))>0)
		{
			self::$module=substr($url,0,$pos);//模块
			$url=substr($url,$pos+1);//除去模块名称，剩下的url字符串
			$flag=1;//标志可以正常查找到模块
		}
		else
		{	//如果找不到模块分隔符，以当前网址为模块名
			self::$module=$url;
		}

		$flag2=0;//用来表示是否需要解析参数
		//获取操作方法名称
		if($url&&($pos=@strpos($url,self::$config['URL_ACTION_DEPR'],1))>0)
		{
			self::$action=substr($url,0,$pos);//模块
			$url=substr($url,$pos+1);
			$flag2=1;//表示需要解析参数
		}
		else
		{
			//只有可以正常查找到模块之后，才能把剩余的当作操作来处理
			//因为不能找不到模块，已经把剩下的网址当作模块处理了
			if($flag)
			{
				self::$action=$url;
			}
		}
		//解析参数
		if($flag2)
		{
			$param=explode(self::$config['URL_PARAM_DEPR'],$url);
			$param_count=count($param);
			for($i=0; $i<$param_count;$i=$i+2)
			{
				$_GET[$i]=$param[$i];
				if(isset($param[$i+1]))
				{
					if(!is_numeric($param[$i]))
					{
						$_GET[$param[$i]]=$param[$i+1];
					}
					$_GET[$i+1]=$param[$i+1];
				}
			}
		}
	}

    /**
	 *常量定义
	 */
	 private function _define()
	{
		$root=str_replace(basename($_SERVER["SCRIPT_NAME"]),'',$_SERVER["SCRIPT_NAME"]);
		$root=substr($root,0,-1);//去掉最后的斜杠
		$root='http://'.$_SERVER['HTTP_HOST'].$root;//网址加上完整域名
		//__ROOT__和__PUBLIC__常用于图片，css，js定位
		//__APP__和__URL__常用于网址定位

		define('__ROOT__',$root);//当前入口所在的目录
		define('__PUBLIC__',$root.'/public');//当前入口所在的目录
		//如果开启了重写，则网址不包含入口文件，如index.php
		if(self::$config['URL_REWRITE_ON'])
		{
			define('__APP__',__ROOT__);
		}
		else
		{
			define('__APP__',__ROOT__.'/'.basename($_SERVER["SCRIPT_NAME"]));//当前入口文件
		}
		define('__URL__',__APP__.'/'.self::$module);//当前模块
	}

	/**
	 *默认文件包含
	 */
	 private function _include()
	{
		//加载常用函数库
		if(is_file(GPHP_PATH.'/../lib/common.function.php')){
			require(GPHP_PATH.'/../lib/common.function.php');
		}
		//加载扩展文件
		if(is_file(GPHP_PATH.'/../ext/extend.php')){
			require(GPHP_PATH.'/../ext/extend.php');
		}
		//加载扩展函数库
		if(is_file(GPHP_PATH.'/../ext/extend.function.php')){
			require(GPHP_PATH.'/../ext/extend.function.php');
		}
	}

	/**
	 * 获取模块
	 */
	 private function _module() {
		if (isset($_GET[self::$config["MODULE_KEYWORD"]]) && !empty( $_GET[self::$config["MODULE_KEYWORD"]] ) ){
			$module = $_GET[self::$config["MODULE_KEYWORD"]];
		}else if(isset($_POST[self::$config["MODULE_KEYWORD"]]) && !empty($_POST[self::$config["MODULE_KEYWORD"]])){
			$module = $_POST[self::$config["MODULE_KEYWORD"]];
		}else{
			$module = self::$config["MODULE_DEFAULT"];
		}
		
		$module = myaddslashes(strip_tags($module));
		self::$module = $module;
	}

	/**
	 * 获取事件
	 */
	private function _action() {
		if (isset($_GET[self::$config["ACTION_KEYWORD"]]) && !empty( $_GET[self::$config["ACTION_KEYWORD"]] ) ){
			$action = $_GET[self::$config["ACTION_KEYWORD"]];
		}else if(isset($_POST[self::$config["ACTION_KEYWORD"]]) && !empty($_POST[self::$config["ACTION_KEYWORD"]])){
			$action = $_POST[self::$config["ACTION_KEYWORD"]];
		}else{
			$action = self::$config["ACTION_DEFAULT"];
		}
		
		$module = myaddslashes(strip_tags($module));	
		self::$action = $action;
	}

	/**
	 * 安全过滤
	 */
	private function myaddslashes($input)
	{
		if (!get_magic_quotes_gpc()){
			if (!is_array($input)){
				addslashes($input);
			}else{
				foreach($input as $key => $val){
					$input[$key] = myaddslashes($val);
				}
			}
		}
		return $input;
	}
}
?>